NAT Gateway上EIPの削除及び作成直後のステータス取得にはfilterへstate指定を忘れずに
はじめに
CFnのスタック再作成によるECSの更新を行おうとした所、想定しえない部分でハマりをみました。
An error occurred (InvalidElasticIpID.NotFound) when calling the CreateTags operation: The elasticIp ID 'eipalloc-XXXXXXXXXXXXXXX' does not exist
管理コンソール上のEIP一覧を見ると、該当するEIPのIDは存在していません。「はて何が起こったんだろう」と傾げつつ、解決にまで至った過程をまとめました。
エラーの原因
スタック作成用のバッチではaws ec2 describe-nat-gateways
で取得したAllocationIdを用いて、aws ec2 create-tags
にてタグ付けを行う処理を行っています。
ただ、存在していないEIPが渡ってきている状態です。実際のNAT Gateway上にあるEIPはどうなっているのか、バッチ内のコマンドを直実行で確認したところ、
> aws ec2 describe-nat-gateways --filter Name=tag:Name,Values=XXXXXX | jq -r '.NatGateways[].NatGatewayAddresses[]' { "PublicIp": "............", "NetworkInterfaceId": "eni-IIIIIIIIIIIIIIIIII", "AllocationId": "eipalloc-XXXXXXXXXXXXXXXXXX", "PrivateIp": ".........." } { "PublicIp": "............", "NetworkInterfaceId": "eni-IIIIIIIIIIIIIIIIII", "AllocationId": "eipalloc-YYYYYYYYYYYYYYYYYY", "PrivateIp": ".........." }
と、2つでてきました。上のAllocationIdは存在していないとされているもので、下のAllocationIdが管理コンソール上で存在が確認できたものです。これだけだと詳細が不明ですが、恐らくは何らかの絞りが足りていない。
対処
EIPは削除を実行すると、available から deleting に、そして deleted へと変わります。 describe-nat-gateways — AWS CLI 1.17.9 Command Reference
CFnでのスタック更新にてEIPの削除と作成が発生した場合、タイミング次第ですがfilterでstatusの絞りを入れてなければ delete と available 双方のEIPがでてくる状態となります。
よって、意図した処理には
aws ec2 describe-nat-gateways --filter Name=tag:Name,Values=XXXXXX Name=state,Values=available | jq -r '.NatGateways[].NatGatewayAddresses[]'
とするのがベターだということになります。
あとがき
今回のスタック再作成に至った理由は、以前ECSの更新速度検証での無茶な値付けが原因で、該当設定を操作しても更新が上手く行かないためでした。該当スタックでのchange-setによる更新時にエラーが起こるため、解消すべく一度削除した上での作成としました。
色々な要因が重なった結果での今回のエラー対処となりましたが、結果としてEIPの操作には時間差も考慮が必要だと分かりました。EIP操作を含んだスタック操作機会はそこまで多くないかもしれませんが、万が一同様な状態にて解決の糸口になれば幸いです。